package com.ws.keyword;
/*
final：最终的

1.final可以用来修饰结构、类、方法、变量

2.final 用来修饰类：此类不能被其他类所继承
    比如：String类、System类、StringBuffer类

3.final 用来修饰方法：表明此方法不可以被重写
    比如：Object类中getClass()

4.final 用来修饰变量：此时的 "变量" 就称为一个常量
    4.1 final修饰属性：
        可以考虑赋值的位置有：显示初始化、代码块中赋值、构造器中初始化
    4.2 final修饰局部变量：
        尤其是使用 final 修饰形参时，表明此形参是一个常量。当我们调用此方法时，
        就给常量形参赋一个实参。一旦赋值以后，就只能在方法体内使用此形参，且不能重新赋值

static final 用来修饰属性：全局常量

 */
public class FinalTest {

    static final int WIDTH = 20;
    final int LEFT;
    final int RIGHT;

    {
        LEFT = 1;
    }

    public FinalTest() {
        RIGHT = 2;
    }

    public FinalTest(int LEFT) {
        this();
    }

    public void doWidth() {
        //Cannot assign a value to final variable 'width'
        //width = 20;
    }

    public void show() {
        final int NUM = 10;//常量
//        NUM += 20;//Cannot assign a value to final variable 'NUM'
    }

    public void show(final int num) {
        System.out.println(num);
//        num += 10;//Cannot assign a value to final variable 'num'
    }


    public static void main(String[] args) {

        FinalTest test = new FinalTest();
        test.show(23);

        int num = 10;

        num = num + 5;
    }

}

final class FinalA {

}

//Cannot inherit from final 'com.ws.keyword.FinalA'
//class B extends FinalA {
//
//}

class AA {
    public final void show () {

    }
}

class BB extends AA {
    //overridden method is final
//    public void show () {
//
//    }
}
